home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / game / board / Chaos_src.lha / chaos / src / ProjectAmi.c < prev    next >
C/C++ Source or Header  |  1995-05-09  |  12KB  |  456 lines

  1. /*  Chaos:                  The Chess HAppening Organisation System     V5.3
  2.     Copyright (C)   1993    Jochen Wiedmann
  3.  
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.  
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU General Public License for more details.
  13.  
  14.     You should have received a copy of the GNU General Public License
  15.     along with this program; if not, write to the Free Software
  16.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18.  
  19.     $RCSfile: ProjectAmi.c,v $
  20.     $Revision: 3.4 $
  21.     $Date: 1994/11/19 19:32:01 $
  22.  
  23.     This file contains the system dependent functions that support the
  24.     Project menu.
  25.  
  26.     Computer:   Amiga 1200                  Compiler:   Dice 2.07.54 (3.0)
  27.  
  28.     Author:     Jochen Wiedmann
  29.         Am Eisteich 9
  30.       72555 Metzingen
  31.         Tel. 07123 / 14881
  32.         Internet: jochen.wiedmann@zdv.uni-tuebingen.de
  33. */
  34.  
  35.  
  36. #ifndef CHAOS_H
  37. #include "chaos.h"
  38. #endif
  39.  
  40. #ifdef AMIGA
  41. #include <libraries/asl.h>
  42. #include <libraries/gadtools.h>
  43. #include <libraries/dos.h>
  44. #include <proto/asl.h>
  45. #include <proto/icon.h>
  46. #endif  /*  AMIGA   */
  47.  
  48.  
  49.  
  50.  
  51. /*
  52.     FileRequest() creates a file requester which reads a file name.
  53.  
  54.     Inputs: defaultfile a pointer to a string containing the default name
  55.         title       a pointer to a string containing the requester's
  56.             title. This may be NULL, in which case
  57.             MSG_CDAT_SELECTION is assumed.
  58.         ending      a pointer to a string containing the default ending.
  59.             This may be NULL, in which case "#?.cdat" is assumed.
  60.             Note, that this MUST be something like "#?.xxx" on
  61.             the Amiga!
  62.         savemode    TRUE, if non-existing files may be selected.
  63.  
  64.     Result: Full path name of the file, that was selected or NULL, if the
  65.         user cancelled.
  66. */
  67. char *FileRequest(char *defaultfile, char *title, char *ending, int savemode)
  68.  
  69. #ifdef AMIGA
  70. { struct FileRequester *requester;
  71.   char pattern[20];
  72.   char *result = NULL;
  73.   char *filename, *pathname, *endptr;
  74.   BPTR dir;
  75.   static char FileRequestName[TRNFILENAME_LEN+1];
  76.   static char PathName[TRNFILENAME_LEN+1];
  77.   struct Window *window;
  78.  
  79.  
  80.   /*
  81.       Bring up default settings, if needed.
  82.   */
  83.   if (title == NULL)
  84.   { title = (char *) MSG_CDAT_SELECTION;
  85.   }
  86.   if (ending == NULL)
  87.   { ending = "#?.cdat";
  88.   }
  89.  
  90.  
  91.   /*
  92.       Get Intuition window pointer from MUI window, allocate Filerequester
  93.       and parse the ending for wildcards.
  94.   */
  95.   get(MainWnd, MUIA_Window_Window, &window);
  96.   if ((requester = (struct FileRequester *)
  97.            MUI_AllocAslRequest(ASL_FileRequest, NULL))  ==  NULL)
  98.   { MemError();
  99.     return(NULL);
  100.   }
  101.   ParsePatternNoCase((UBYTE *) ending, (UBYTE *) pattern, sizeof(pattern));
  102.  
  103.  
  104.   /*
  105.       Get default file- and drawername.
  106.   */
  107.   if (defaultfile  &&  *defaultfile != '\0')
  108.   { strcpy(FileRequestName, defaultfile);
  109.   }
  110.   else
  111.   { if (TrnFileName != '\0')
  112.     { strcpy(FileRequestName, TrnFileName);
  113.     }
  114.     else
  115.     { sprintf(FileRequestName, savemode ? "chaos.%d.cdat" : "", NumRounds);
  116.     }
  117.   }
  118.   filename = (char *) FilePart((STRPTR) FileRequestName);
  119.   strcpy(PathName, FileRequestName);
  120.   *(pathname = (char *) PathPart((STRPTR) PathName)) = '\0';
  121.  
  122.  
  123.   /*
  124.       Make the drawername absolute.
  125.   */
  126.   dir = Lock((STRPTR) PathName, SHARED_LOCK);
  127.   NameFromLock(dir, (STRPTR) PathName, sizeof(PathName));
  128.   UnLock(dir);
  129.  
  130.   /*
  131.      Ensure, that the default filename has the right ending.
  132.   */
  133.   if (ending != NULL  &&  (endptr = strrchr(filename, '.')) != NULL)
  134.   { strcpy(endptr, ending+2);
  135.   }
  136.  
  137.  
  138.   /*
  139.       Bring up the requester
  140.   */
  141. #ifdef V39_INCLUDES
  142.   if (MUI_AslRequestTags(requester,
  143.              ASLFR_Window, window,
  144.              ASLFR_PrivateIDCMP, TRUE,
  145.              ASLFR_SleepWindow, TRUE,
  146.              ASLFR_TitleText, title,
  147.              ASLFR_InitialFile, filename,
  148.              ASLFR_InitialDrawer, PathName,
  149.              ASLFR_InitialPattern, ending,
  150.              ASLFR_DoSaveMode, savemode,
  151.              ASLFR_RejectIcons, TRUE,
  152.              ASLFR_AcceptPattern, pattern,
  153.              TAG_DONE)  !=  FALSE   &&
  154.       requester->fr_File != NULL  &&  requester->fr_File != '\0')
  155.   { strcpy(FileRequestName, (char *) requester->fr_Drawer);
  156.     AddPart((STRPTR) FileRequestName, requester->fr_File,
  157.         sizeof(FileRequestName));
  158.     result = FileRequestName;
  159.   }
  160. #else
  161.   if (MUI_AslRequestTags(requester,
  162.              ASL_Window, window,
  163.              ASL_Hail, title
  164.              ASL_File, filename,
  165.              ASL_Dir, PathName,
  166.              TAG_DONE)  ==  FALSE   &&
  167.       requester->rf_File != NULL  &&  requester->rf_File != '\0')
  168.   { strcpy(FileRequestName, (char *) requester->rf_Dir);
  169.     AddPart((STRPTR) FileRequestName, (STRPTR) requester->rf_File,
  170.         sizeof(FileRequestName));
  171.     result = FileRequestName;
  172.   }
  173. #endif
  174.   MUI_FreeAslRequest((APTR) requester);
  175.   return (result);
  176. }
  177. #endif  /*  AMIGA   */
  178.  
  179.  
  180.  
  181.  
  182. /*
  183.     CreateIcon() puts an icon to a recently saved file.
  184.  
  185.     Inputs: name of the file just created; must not be NULL
  186. */
  187. void CreateIcon(char *name)
  188.  
  189. #ifdef AMIGA
  190. { extern int MakeIcons;
  191.  
  192.   /*
  193.       Does the user want to have an icon?
  194.   */
  195.   if (MakeIcons)
  196.   { /*
  197.     Yes, get a diskobject
  198.     */
  199.     struct DiskObject *dobj;
  200.     char *olddeftool;
  201.     int len = strlen(IconName);
  202.  
  203.     /*
  204.     Icon.library doesn't like a trailing ".info" when calling
  205.     GetDiskObject().
  206.     */
  207.     if (len >= 5  &&
  208.     Stricmp((STRPTR) IconName+len-5, (STRPTR) ".info") == 0)
  209.     { IconName[len-5] = '\0';
  210.     }
  211.  
  212.     if ((dobj = GetDiskObject((STRPTR) IconName))  !=  NULL  ||
  213.     (dobj = GetDiskObject((STRPTR) "s:Chaos_Project"))  !=  NULL  ||
  214.     (dobj = GetDefDiskObject(WBPROJECT))  !=  NULL)
  215.     { /*
  216.       Put the right settings into the diskobject and save it.
  217.       */
  218.       dobj->do_Type = WBPROJECT;
  219.       olddeftool = dobj->do_DefaultTool;
  220.       dobj->do_DefaultTool = ProgName;
  221.       dobj->do_CurrentX = dobj->do_CurrentY = NO_ICON_POSITION;
  222.       if (dobj->do_StackSize < 20000)
  223.       { dobj->do_StackSize = 20000;
  224.       }
  225.       PutDiskObject((STRPTR) name, dobj);
  226.       dobj->do_DefaultTool = olddeftool;
  227.       FreeDiskObject(dobj);
  228.     }
  229.   }
  230. }
  231. #else   /*  !AMIGA  */
  232. {   /*
  233.     There is nothing to be done on other systems.
  234.     */
  235. }
  236. #endif  /*  !AMIGA  */
  237.  
  238.  
  239.  
  240.  
  241. /*
  242.     AskSave brings up a requester asking the user, if he wants to save
  243.     first.
  244. */
  245. int AskSave(void)
  246.  
  247. #ifdef AMIGA
  248. {
  249.   switch (MUI_RequestA(App, MainWnd, 0,
  250.                (char *) MSG_ATTENTION,
  251.                (char *) MSG_YES_NO_CANCEL,
  252.                (char *) MSG_CHANGES_MADE, NULL))
  253.   { case 2:
  254.       return(TRUE);
  255.     case 1:
  256.       return(SaveTournament(NULL));
  257.   }
  258.   return(FALSE);
  259. }
  260. #endif  /*  AMIGA   */
  261.  
  262.  
  263.  
  264.  
  265. /*
  266.     The TerminateTrnWnd() function closes the tournament input window.
  267. */
  268. #ifdef AMIGA
  269. static APTR TrnWnd = NULL; /*  Tournament window                   */
  270. static APTR TrnOkGad;      /*  Ok gadget (tournament window)       */
  271. static APTR TrnCancelGad;  /*  Cancel gadget (tournament window)   */
  272. static APTR TrnNameGad;    /*  Tournament name gadget              */
  273. static APTR WinnerPointsGad; /* Winner points gadget               */
  274. static APTR DrawPointsGad;   /* Draw points gadget                 */
  275.  
  276. void TerminateTrnWnd(void)
  277.  
  278. { if (TrnWnd)
  279.   { set(TrnWnd, MUIA_Window_Open, FALSE);
  280.     DoMethod(App, OM_REMMEMBER, TrnWnd);
  281.     MUI_DisposeObject(TrnWnd);
  282.     TrnWnd = NULL;
  283.   }
  284. }
  285. #endif  /*  AMIGA   */
  286.  
  287.  
  288.  
  289.  
  290. /*
  291.     The InitTrnWnd() function brings up a window, that allows to input
  292.     tournament data.
  293.  
  294.     Inputs: name    pointer to a buffer, that can hold the tournament name
  295.         winnerpoints    current number of points for winning a game
  296.         drawpoints      current number of points for a draw
  297.  
  298.     Results: TRUE, if successfull, FALSE otherwise
  299. */
  300. #ifdef AMIGA
  301. #define ID_TrnWnd_Cancel    201
  302. #define ID_TrnWnd_Ok        202
  303. int InitTrnWnd(char *buffer, int winnerpoints, int drawpoints)
  304.  
  305. { ULONG open;
  306.   int OK_SC = *MSG_OK_SC;
  307.   int Cancel_SC = *MSG_CANCEL_SC;
  308.  
  309.   /*
  310.       Open the window and check for success.
  311.   */
  312.   TrnWnd = WindowObject,
  313.         MUIA_Window_ID, MAKE_ID('T','R','N','I'),
  314.         MUIA_Window_Title, MSG_TOURNAMENT_INPUT_TITLE,
  315.         MUIA_Window_Width, MUIV_Window_Width_MinMax(40),
  316.         WindowContents, VGroup,
  317.         Child, HGroup,
  318.             Child, Label2(MSG_TOURNAMENT_NAME_OUTPUT),
  319.             Child, TrnNameGad = StringObject,
  320.             StringFrame,
  321.             MUIA_String_MaxLen, TRNNAME_LEN+1,
  322.             MUIA_String_Contents, buffer,
  323.             End,
  324.         End,
  325.         Child, VSpace(0),
  326.         Child, HGroup,
  327.             Child, VGroup,
  328.             Child, Label2(MSG_WINNERPOINTS),
  329.             Child, Label2(MSG_DRAWPOINTS),
  330.             End,
  331.             Child, VGroup,
  332.             Child, WinnerPointsGad = StringObject,
  333.                 StringFrame,
  334.                 MUIA_String_MaxLen, 3,
  335.                 MUIA_String_Accept, "0123456789 ",
  336.                 MUIA_String_Integer, winnerpoints,
  337.             End,
  338.             Child, DrawPointsGad = StringObject,
  339.                 StringFrame,
  340.                 MUIA_String_MaxLen, 3,
  341.                 MUIA_String_Accept, "0123456789 ",
  342.                 MUIA_String_Integer, drawpoints,
  343.             End,
  344.             End,
  345.             Child, HSpace(0),
  346.         End,
  347.         Child, VSpace(0),
  348.         Child, HGroup,
  349.             MUIA_Group_SameSize, TRUE,
  350.             Child, TrnOkGad = KeyButton(MSG_OK, OK_SC),
  351.             Child, HSpace(0),
  352.             Child, TrnCancelGad = KeyButton(MSG_CANCEL_INPUT, Cancel_SC),
  353.         End,
  354.         End,
  355.     End;
  356.   if (!TrnWnd)
  357.   { return(FALSE);
  358.   }
  359.   DoMethod(App, OM_ADDMEMBER, TrnWnd);
  360.   DoMethod(TrnWnd, MUIM_Window_SetCycleChain, TrnNameGad, TrnOkGad,
  361.        TrnCancelGad, NULL);
  362.   set(TrnWnd, MUIA_Window_ActiveObject, TrnNameGad);
  363.  
  364.  
  365.   /*
  366.       Setting up the notification events for the tournament input window:
  367.       CloseWindow, Ok- and Cancel Gadget
  368.   */
  369.   DoMethod(TrnWnd, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, App, 2,
  370.        MUIM_Application_ReturnID, ID_TrnWnd_Cancel);
  371.   DoMethod(TrnWnd, MUIM_Notify, MUIA_Window_InputEvent, "ctrl return",
  372.        App, 2, MUIM_Application_ReturnID, ID_TrnWnd_Ok);
  373.   DoMethod(TrnOkGad, MUIM_Notify, MUIA_Pressed, FALSE, App, 2,
  374.        MUIM_Application_ReturnID, ID_TrnWnd_Ok);
  375.   DoMethod(TrnCancelGad, MUIM_Notify, MUIA_Pressed, FALSE, App, 2,
  376.        MUIM_Application_ReturnID, ID_TrnWnd_Cancel);
  377.   DoMethod(TrnWnd, MUIM_Window_SetCycleChain,
  378.        TrnNameGad, WinnerPointsGad, DrawPointsGad, TrnOkGad, TrnCancelGad,
  379.        NULL);
  380.   DoMethod(TrnNameGad, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
  381.        TrnWnd, 3, MUIM_Set, MUIA_Window_ActiveObject, WinnerPointsGad);
  382.   DoMethod(WinnerPointsGad, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
  383.        TrnWnd, 3, MUIM_Set, MUIA_Window_ActiveObject, DrawPointsGad);
  384.   DoMethod(DrawPointsGad, MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime,
  385.        TrnWnd, 3, MUIM_Set, MUIA_Window_ActiveObject, TrnNameGad);
  386.  
  387.  
  388.   set(TrnWnd, MUIA_Window_Open, TRUE);
  389.   get(TrnWnd, MUIA_Window_Open, &open);
  390.   if (!open)
  391.   { MUIError((char *) ERRMSG_CANNOT_OPEN_WINDOW);
  392.     TerminateTrnWnd();
  393.     return(FALSE);
  394.   }
  395.   set(TrnWnd, MUIA_Window_ActiveObject, TrnNameGad);
  396.  
  397.   set(MainWnd, MUIA_Window_Open, FALSE);
  398.   return(TRUE);
  399. }
  400. #endif  /*  AMIGA   */
  401.  
  402.  
  403.  
  404.  
  405. /*
  406.     The ProcessTrnWnd() function waits for user actions concerning
  407.     the tournament input window.
  408.  
  409.     Inputs: buffer  pointer to a string, that holds the users input.
  410.             (Not needed on the Amiga.)
  411.         winnerpoints    pointer to an int where to store the
  412.                 number of points for winning a game
  413.                 game
  414.         drawpoints      pointer to an int where to store the
  415.                 number of points for a draw
  416.  
  417.     Results:    0   Indicates, that the user has cancelled.
  418.         1   Indicates, that this has to be called again.
  419.         -1  Terminating via Ok-Gadget, okay
  420. */
  421. int ProcessTrnWnd(char *buffer, int *winnerpoints, int *drawpoints)
  422.  
  423. #ifdef AMIGA
  424. { ULONG Signal;
  425.   char *name;
  426.  
  427.   /*
  428.       Check for user actions
  429.   */
  430.   switch (DoMethod(App, MUIM_Application_Input, &Signal))
  431.   { case MUIV_Application_ReturnID_Quit:
  432.       if (TestSaved())
  433.       { exit(0);
  434.       }
  435.       break;
  436.     case ID_TrnWnd_Cancel:
  437.       return(0);
  438.     case ID_TrnWnd_Ok:
  439.       /*
  440.       Get the final state of the tournament name gadget.
  441.       */
  442.       if (buffer)
  443.       { get(TrnNameGad, MUIA_String_Contents, &name);
  444.     strcpy (buffer, name);
  445.     get(WinnerPointsGad, MUIA_String_Integer, winnerpoints);
  446.     get(DrawPointsGad, MUIA_String_Integer, drawpoints);
  447.       }
  448.       return(-1);
  449.   }
  450.   if (Signal)
  451.   { Wait(Signal);
  452.   }
  453.   return(1);
  454. }
  455. #endif
  456.